home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / DMTDEMOS / GETMBR.PAS < prev    next >
Pascal/Delphi Source File  |  1994-07-02  |  3KB  |  127 lines

  1. program GetMBRSample;
  2. (*
  3.  
  4.  The DOS FDISK command creates a special sector on the very first hard disk
  5.  sector ( head 0, track 0, sector 0 ) called the partition sector or the master
  6.  boot record (MBR), this sector defines each partition's area and whether or
  7.  not the partition is a bootable partition. This program shows the partition
  8.  entries contained in the MBR sector for drive C.
  9.  
  10. *)
  11.  
  12.  uses crt, DMT;
  13.  
  14.  var
  15.    MBRbuffer : MBRstruct;    { The MBRstruct data type is defined in the DMT unit }
  16.  
  17.    Partition : string[ 25 ];
  18.  
  19.    Count,
  20.    Sector    : byte;
  21.  
  22.    Track     : word;
  23.  
  24.    DrvLetter : char;
  25.  
  26. procedure SplitSectTrack(  Sect,
  27.                            Cyl     : byte;
  28.  
  29.                            var
  30.                             Sector : byte;
  31.  
  32.                            var
  33.                             Track  : word );
  34.  
  35. (*
  36.    For hard disks the track is a 10 bits value, the lower 8 bits reside in
  37.    the TRACK variable and the upper two bits reside in bits 7 and 8 of the
  38.    SECTOR variable; the lower 6 bits of SECTOR contain the disk 's sector
  39.    number.
  40. *)
  41.  
  42. begin
  43.   Sector := Sect and $3F;
  44.   Track  := ( Sect and $C0 ) shl 2;
  45.   track  := track + Cyl;
  46. end;
  47.  
  48. begin
  49.   Color( 7, 0 );
  50.   clrscr;
  51.   DrvLetter  := 'C';    (* Selected Hard Disk C *)
  52.  
  53.   (* Reads the MBR sector from the hard disk into a buffer. *)
  54.  
  55.   ReadSect( DrvLetter, 0, 0, 0, 1, addr( MBRbuffer ) );   { Call ReadSect procedure }
  56.  
  57.   if ( ErrFlag ) then
  58.     begin
  59.       writeln( #7 );
  60.       writeln( 'Error accesing drive C:');
  61.       writeln(ShowError( GetErrCode ) );
  62.       GetEnter;
  63.       exit;
  64.     end;
  65.  
  66.   if ( MBRbuffer.MBRsignature <> $AA55 ) then
  67.     begin
  68.       writeln( #7, 'ERROR : Partition sector invalid.' );
  69.       GetEnter;
  70.       exit;
  71.     end;
  72.  
  73.   writeln;
  74.   writeln( '                   MASTER BOOT RECORD FOR DRIVE ', DrvLetter );
  75.   writeln( ' ┌──────┬──────┬──────────────┬─────────────────┬─────────────────┬─────────┐' );
  76.   writeln( ' │      │      │  Operating   │Partition Start  │ Partition End   │ Sectors │' );
  77.   writeln( ' │Part.#│ Boot │ System type  │Side Track Sector│Side Track Sector│Allocated│' );
  78.   writeln( ' ├──────┼──────┼──────────────┼─────────────────┼─────────────────┼─────────┤' );
  79.  
  80.   for Count := 1 to 4 do
  81.  
  82.    with MBRbuffer.PartEntries[ Count ] do
  83.      begin
  84.        write( ' │   ',Count,'  │');
  85.  
  86.        if BootableFlag = $80 then
  87.          write (' Yes  ')
  88.        else
  89.          write (' No   ');
  90.  
  91.        case PartID of
  92.          $00  : Partition := 'Not assigned  ';
  93.  
  94.          $01  : Partition := 'PRI DOS Fat12 ';
  95.  
  96.          $02,
  97.          $03  : Partition := 'XENIX         ';
  98.  
  99.          $04  : Partition := 'PRI DOS Fat16 ';
  100.  
  101.          $05  : Partition := 'EXTENDED DOS  ';
  102.  
  103.          $06  : Partition := 'DOS > 32Mb    ';
  104.  
  105.          $DB  : Partition := 'CONCURRENT DOS';
  106.  
  107.          else
  108.            Partition := 'Unknown type ';
  109.        end;
  110.  
  111.        SplitSectTrack( StartSect, StartTrack, Sector, Track );
  112.  
  113.        write( '│', Partition , '│');
  114.        write( StartHead : 3, Track : 5, Sector : 5, '    │');
  115.  
  116.        SplitSectTrack( EndSect, EndTrack, Sector, Track );
  117.        write( EndHead : 3, Track : 5, Sector : 5, '    │' );
  118.  
  119.        writeln( InsComma( PartitionSectors ) : 9, '│' );
  120.      end;
  121.  
  122.   writeln( ' └──────┴──────┴──────────────┴─────────────────┴─────────────────┴─────────┘' );
  123.  
  124.   GetEnter;
  125. end.
  126.  
  127.